package com.learn.rabbitmq.quickstart;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author wangxing
 * @version 2020/8/13 22:08 Administrator
 */
public class Consumer {
    public static void main(String[] args) {
        try {
//            创建连接
            Connection connection = RabbitmqUtils.getConnectionFactory().newConnection();
//            创建信道
            Channel channel = connection.createChannel();
            /**
             * 声明一个交换机
             * exchange:交换机的名称
             * type:交换机的类型 常见的有direct,fanout,topic等
             * durable:设置是否持久化。durable设置为true时表示持久化，反之非持久化.持久化可以将交换器存入磁盘，在服务器重启的时候
             * autodelete:设置是否自动删除。autoDelete设置为true时，则表示自动删除。自动删除的前提是至少有一个队列或者交换器与这个
             * 不能错误的理解—当与此交换器连接的客户端都断开连接时，RabbitMq会自动删除本交换器
             * arguments:其它一些结构化的参数，比如：alternate-exchange
             */
            channel.exchangeDeclare(Producter.EXCHANGE,"direct",true,false,null);
//            声明队列
            channel.queueDeclare(Producter.QUEUE_NAME, true, false, false, null);
            //        5创建消费者
            DefaultConsumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                           byte[] body) throws IOException {
//                路由的key
                    System.out.println("路由的key:" + envelope.getRoutingKey());
//                交换机
                    System.out.println("交换机:" + envelope.getExchange());
//                消息id
                    System.out.println("消息id:" + envelope.getDeliveryTag());
//                接收到的消息
                    System.out.println("接收到的消息:" + new String(body, "utf-8"));

                }
            };
//        6监听队列
            //队列名,是否要自动确认,消费者
            channel.basicConsume(Producter.QUEUE_NAME, true
                    , consumer);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }
}
